package com.fenghuajueli.libbasecoreui.baseswitch;

import android.text.TextUtils;

import com.blankj.utilcode.util.AppUtils;
import com.blankj.utilcode.util.GsonUtils;
import com.blankj.utilcode.util.LogUtils;
import com.fenghuajueli.lib_data.entity.key.AdInfoEntity;
import com.fenghuajueli.lib_data.entity.key.SwitchCommentEntity;
import com.fenghuajueli.lib_data.entity.key.SwitchKeyEntity;
import com.fenghuajueli.libbasecoreui.constants.AppConfigInfo;
import com.fenghuajueli.libbasecoreui.constants.SwitchConfig;
import com.fenghuajueli.libbasecoreui.constants.SwitchKeyConstants;
import com.fenghuajueli.libbasecoreui.listener.BaseCallBackListener;
import com.fenghuajueli.libbasecoreui.utils.MmkvUtils;
import com.fenghuajueli.libbasecoreui.utils.PrivacyConstantsUtils;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;

import java.util.List;

public class SwitchKeyUtils {

    /**
     * 当前app是否需要强制升级使用，true标识需要，弹窗提醒升级 不可取消对话框，因为这个开关是实时性的，不要做存储，未获取到就不提醒升级
     */
    private static boolean isAppUpdate = false;

    public static void getSwitchKey() {
        getSwitchKey(null);
    }


    /**
     * 添加回调，需要在启动页做处理的，就用这个方法，然后注释掉用户模块的初始化
     * 用对应的应用的appid在测试时需要注意
     * 会有请求限制 好像是10分钟6次  同一个ip，所以在公司测试需要注意这个问题
     *
     * @param onBaseClick
     */
    public static void getSwitchKey(BaseCallBackListener<String> onBaseClick) {
        String appId = AppConfigInfo.APPLICATION_ID;
        SwitchRequest.getSwitchKey(appId, new BaseCallBackListener<String>() {
            @Override
            public void onSuccess(String data) {
                try {
                    resetAllSwitch();
                    JsonParser jsonParser = new JsonParser();
                    JsonObject jsonObject = jsonParser.parse(data).getAsJsonObject();
                    JsonArray jsonArray = jsonObject.get("data").getAsJsonArray();
                    List<SwitchKeyEntity> switchKeyEntityList = GsonUtils.getGson()
                            .fromJson(jsonArray, new TypeToken<List<SwitchKeyEntity>>() {
                            }.getType());

                    LogUtils.json(data);
                    for (SwitchKeyEntity switchKeyEntity : switchKeyEntityList) {
                        if ((appId + "NOPAY").equals(switchKeyEntity.getApp_func_key())) {
                            handlerPayStatus(switchKeyEntity.getApp_func_val());
                        } else if ((appId + "PING").equals(switchKeyEntity.getApp_func_key())) {
                            handlerCommentStatus(switchKeyEntity.getApp_func_val());
                        } else if ((appId + "SPAREQQ").equals(switchKeyEntity.getApp_func_key())) {
                            handlerQQStatus(switchKeyEntity.getApp_func_val());
                        } else if ((appId + "freetime").equals(switchKeyEntity.getApp_func_key())) {
                            handlerFreeTimeStatus(switchKeyEntity.getApp_func_val());
                        } else if ((appId + "NOADVERF").equals(switchKeyEntity.getApp_func_key())) {
                            handlerAdStatus(switchKeyEntity.getApp_func_val());
                        } else if ((appId + "UPDATE").equals(switchKeyEntity.getApp_func_key())) {
                            handlerUpdateStatus(switchKeyEntity.getApp_func_val());
                        } else if ((appId + "MEIQIAKF").equals(switchKeyEntity.getApp_func_key())) {
                            handlerMqServerUrl(switchKeyEntity.getApp_func_val());
                        } else if ((appId + "NOHEGUIAD").equals(switchKeyEntity.getApp_func_key())) {
                            //合规化广告开关
                            handlerStandardAd(switchKeyEntity.getApp_func_val());
                        }
                    }
                    if (onBaseClick != null) {
                        onBaseClick.onSuccess("开关获取成功");
                    }
                } catch (Exception e) {
                    resetAllSwitch();
                    LogUtils.d("开关解析异常：" + e.toString());
                    if (onBaseClick != null) {
                        onBaseClick.onFailed("开关获取失败");
                    }

                }
            }

            @Override
            public void onFailed(String error) {
                LogUtils.d("获取key失败:" + error);
                if (onBaseClick != null) {
                    onBaseClick.onFailed("开关获取失败");
                }
            }

            @Override
            public void onHandlerStart() {
                if (onBaseClick != null) {
                    onBaseClick.onHandlerStart();
                }
            }
        });

    }

    private static void handlerStandardAd(String stanardAd) {
        LogUtils.d("合规化开关的值：" + stanardAd + "  是否启用合规化：" + (!TextUtils.equals("1", stanardAd)));
        MmkvUtils.save(SwitchKeyConstants.KEY_STANDARD_AD, !TextUtils.equals("1", stanardAd));
    }

    private static void handlerMqServerUrl(String app_func_val) {
        LogUtils.d("当前配置的客服链接：" + app_func_val);
        MmkvUtils.save(SwitchKeyConstants.KEY_MQ_SERVER_URL, app_func_val);
    }

    /**
     * 处理客服qq相关
     *
     * @param data
     */
    private static void handlerQQStatus(String data) {
        saveQQValue(data);
        PrivacyConstantsUtils.qq = getServiceQQ();
        LogUtils.d("客服qq开关：" + getServiceQQ());
    }

    /**
     * 处理付费相关
     *
     * @param data
     */
    private static void handlerPayStatus(String data) {
        if (SwitchConfig.isHuaWeiChannel()) {
            //华为渠道需要判断是否打开
            LogUtils.d("是华为渠道：" + SwitchConfig.currentChannel.toUpperCase(), data);
            if (data.trim().equals("1")) {
                savePayValue(false);
            } else {
                savePayValue(true);
            }
        } else {
            savePayValue(true);
        }
        LogUtils.d("当前渠道：" + SwitchConfig.currentChannel + "---->付费开关：" + getPayStatus());
    }

    /**
     * 处理评论相关
     *
     * @param data
     */
    private static void handlerCommentStatus(String data) {
        try {
            JsonParser jsonParser = new JsonParser();
            if (jsonParser.parse(data).isJsonObject()) {
                JsonObject commentJson = jsonParser.parse(data).getAsJsonObject();
                JsonArray commentArray = commentJson.get("data").getAsJsonArray();
                List<SwitchCommentEntity> switchCommentEntityList = GsonUtils.getGson()
                        .fromJson(commentArray, new TypeToken<List<SwitchCommentEntity>>() {
                        }.getType());
                for (SwitchCommentEntity switchCommentEntity : switchCommentEntityList) {
                    if (switchCommentEntity.getId() == 8) {
                        //华为市场
                        if (SwitchConfig.currentChannel.toUpperCase().equals(SwitchConfig.CHANNEL.HUAWEI.name())) {
                            SwitchConfig.switchCommentEntity = switchCommentEntity;
                            if (switchCommentEntity.getOpen() == 1) {
                                saveCommentValue(true);
                            } else {
                                saveCommentValue(false);
                            }
                            LogUtils.d("当前是华为市场：评论开关：" + getCommentStatus());
                        }
                    }
                    if (switchCommentEntity.getId() == 7) {
                        if (!SwitchConfig.currentChannel.toUpperCase().equals(SwitchConfig.CHANNEL.HUAWEI.name())) {
                            SwitchConfig.switchCommentEntity = switchCommentEntity;
                            if (switchCommentEntity.getOpen() == 1) {
                                saveCommentValue(true);
                            } else {
                                saveCommentValue(false);
                            }
                            LogUtils.d("当前不是华为市场：评论开关：" + getCommentStatus());
                        }
                    }
                }
            } else {
                LogUtils.d("当前评论配置数据异常设为不开启-----》");
                saveCommentValue(false);
            }
        } catch (Exception e) {
            LogUtils.e("评论数据异常：" + e.toString());
            saveCommentValue(false);
        }
    }


    /**
     * 处理免费试用次数
     *
     * @param data
     */
    private static void handlerFreeTimeStatus(String data) {
        try {
            saveFreeTimeValue(Integer.parseInt(data.trim()));
            LogUtils.d("免费次数开关：" + getFreeTime());
        } catch (Exception e) {
            saveFreeTimeValue(0);
        }
    }


    /**
     * 处理版本升级
     *
     * @param data
     */
    private static void handlerUpdateStatus(String data) {
        int currentCode = AppUtils.getAppVersionCode();
        try {
            int version = Integer.parseInt(data.trim());
            //不显示广告
            LogUtils.d("是否提示升级：" + (currentCode < version)
                    + "服务端版本：" + version + "当前APP版本：" + currentCode);
            isAppUpdate = (currentCode < version);
        } catch (Exception e) {
            isAppUpdate = false;
        }
    }


    /**
     * 处理广告开关相关
     * 当获取的值小于等于应用versioncode值时，
     * 该市场应用不显示广告，值与应用版本号不同时，应用正常显示广告。
     *
     * @param data
     */
    private static void handlerAdStatus(String data) {
        int currentCode = AppUtils.getAppVersionCode();
        try {
            AdInfoEntity adInfoEntity = GsonUtils.fromJson(data.trim(), AdInfoEntity.class);
            int version = -1;
            if (SwitchConfig.isHuaWeiChannel()) {
                version = adInfoEntity.getHUAWEINOADVER();
            } else if (SwitchConfig.isOppoChannel()) {
                version = adInfoEntity.getOPPONOADVER();
            } else if (SwitchConfig.isVivoChannel()) {
                version = adInfoEntity.getVIVONOADVER();
            } else if (SwitchConfig.isXiaoMiChannel()) {
                version = adInfoEntity.getXIAOMINOADVER();
            } else if (SwitchConfig.isYybChannel()) {
                version = adInfoEntity.getYYBNOADVER();
            } else {
                version = adInfoEntity.getOTHERNOADVER();
            }
            saveAdValue(version != currentCode);
            //不显示广告
            LogUtils.d("是否显示广告：" + getAdStatus()
                    + "服务端版本：" + version + "当前APP版本：" + currentCode + "渠道："
                    + SwitchConfig.currentChannel);
        } catch (Exception e) {
            saveAdValue(false);
        }
    }


    /**
     * 获取付费的开关
     *
     * @return
     */
    public static boolean getPayStatus() {
        return MmkvUtils.get(SwitchKeyConstants.KEY_HUAWEI_PAY, true);
    }

    /**
     * 获取评论开关值
     *
     * @return
     */
    public static boolean getCommentStatus() {
        return MmkvUtils.get(SwitchKeyConstants.KEY_COMMENT, false);
    }

    /**
     * 获取客服qq
     *
     * @return
     */
    public static String getServiceQQ() {
        return MmkvUtils.get(SwitchKeyConstants.KEY_SHARE_QQ, getDefaultServicesQQ());
    }

    /**
     * 获取免费试用次数
     *
     * @return
     */
    public static int getFreeTime() {
        return MmkvUtils.get(SwitchKeyConstants.KEY_FREE_TIME, 0);
    }

    /**
     * 获取广告开关
     *
     * @return
     */
    public static boolean getAdStatus() {
        return MmkvUtils.get(SwitchKeyConstants.KEY_NO_AD_VERSION, true);
    }


    /**
     * 设置华为付费开关的值
     *
     * @param status
     */
    public static void savePayValue(boolean status) {
        MmkvUtils.save(SwitchKeyConstants.KEY_HUAWEI_PAY, status);
    }

    /**
     * 设置评论开关的值
     *
     * @param status
     */
    public static void saveCommentValue(boolean status) {
        MmkvUtils.save(SwitchKeyConstants.KEY_COMMENT, status);
    }

    /**
     * 设置免费试用次数的值
     *
     * @param count
     */
    public static void saveFreeTimeValue(int count) {
        MmkvUtils.save(SwitchKeyConstants.KEY_FREE_TIME, count);
    }

    /**
     * 设置广告开关的值
     *
     * @param status
     */
    public static void saveAdValue(boolean status) {
        MmkvUtils.save(SwitchKeyConstants.KEY_NO_AD_VERSION, status);
    }

    /**
     * 设置客服qq的值
     *
     * @param status
     */
    public static void saveQQValue(String status) {
        MmkvUtils.save(SwitchKeyConstants.KEY_SHARE_QQ, status);
    }

    /**
     * 获取是否显示版本升级对话框的配置
     *
     * @return
     */
    public static boolean getAppUpdateStatus() {
        return isAppUpdate;
    }

    /**
     * 重置所有开关值
     */
    public static void resetAllSwitch() {
        //华为付费开关默认是打开的  我这里打开就是显示出付费内容
        MmkvUtils.save(SwitchKeyConstants.KEY_HUAWEI_PAY, true);
        MmkvUtils.save(SwitchKeyConstants.KEY_COMMENT, false);
        MmkvUtils.save(SwitchKeyConstants.KEY_FREE_TIME, 0);
        MmkvUtils.save(SwitchKeyConstants.KEY_NO_AD_VERSION, true);
        MmkvUtils.save(SwitchKeyConstants.KEY_SHARE_QQ, getDefaultServicesQQ());
    }

    /**
     * 获取美洽客服配置的链接 如果为空 就显示客服qq
     *
     * @return
     */
    public static String getMQServerUrl() {
        return MmkvUtils.get(SwitchKeyConstants.KEY_MQ_SERVER_URL, "");
    }

    /**
     * 返回是否启用合规化配置 此值设置给广告合规化参数更新方法即可
     * setDownloadAndClickConfig(boolean)
     *
     * @return 默认返回以合规化进行请求广告
     */
    public static boolean isOpenStandardAd() {
        return MmkvUtils.get(SwitchKeyConstants.KEY_STANDARD_AD, true);
    }


    /**
     * 根据公司名来返回默认的客服qq值
     * 2421172572  由于被封掉了  替换为3519353228
     *
     * @return
     */
    private static String getDefaultServicesQQ() {
        if (AppConfigInfo.APP_COMPANY.contains("上翼技术")
                || AppConfigInfo.APP_COMPANY.contains("上海诚音")) {
            return "3519353228";
        } else if (AppConfigInfo.APP_COMPANY.contains("上海聆励")
                || AppConfigInfo.APP_COMPANY.contains("上海啸览")) {
            return "3445687403";
        } else if (AppConfigInfo.APP_COMPANY.contains("上海航慕")
                || AppConfigInfo.APP_COMPANY.contains("长沙先讯")) {
            return "430642756";
        } else if (AppConfigInfo.APP_COMPANY.contains("全美联合")
                || AppConfigInfo.APP_COMPANY.contains("上海翼询")) {
            return "2141826904";
        } else if (AppConfigInfo.APP_COMPANY.contains("上海青灯")
                || AppConfigInfo.APP_COMPANY.contains("上海葵信")) {
            return "429816871";
        } else if (AppConfigInfo.APP_COMPANY.contains("爱剪辑影视")
                || AppConfigInfo.APP_COMPANY.contains("上翼教育")) {
            return "3484719691";
        } else if (AppConfigInfo.APP_COMPANY.contains("上海追书")) {
            return "2679535322";
        } else if (AppConfigInfo.APP_COMPANY.contains("青易")
                || AppConfigInfo.APP_COMPANY.contains("不屈")) {
            return "2159472585";
        } else {
            return "3519353228";
        }
    }
}
